package com.projles.ttd.minigames;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

import com.projles.ttd.R;
import com.projles.ttd.util.Carta;
import com.projles.ttd.util.Jogador;
import com.projles.ttd.util.Player;

public class MiniGameCartasActivity extends Activity implements OnClickListener{

	private List<Jogador> jogadores = new ArrayList<Jogador>();
	private List<Integer> cartas = new ArrayList<Integer>();

	private TableLayout tb;
	private ImageView cartaAberta;
	private TextView campoJogador;
	
	private Integer indiceJogadorAtual;
    private Jogador jogadorAtual;
    private boolean inverteuOrdem = false;
    
    private Player player;
    
	
	
	@SuppressWarnings("unchecked")
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.minigame_cartas);
		
		tb = (TableLayout) findViewById(R.id.tabela_cartas);
		cartaAberta = (ImageView) findViewById(R.id.cartaaberta);
		campoJogador = (TextView) findViewById(R.id.txt_jogador_cartas);
		
		player = Player.getPlayer(this);
		
    	//Pegando os parametros da Intent passados na Activity anterior
    	Bundle params = getIntent().getExtras();
    	jogadores = (ArrayList<Jogador>) params.get("jogadores");
		
    	indiceJogadorAtual = -1;
    	atualizarJogadorAtual();

		povoaListaCartas();
		criarLayout();
	}
	
	private void povoaListaCartas() {
		
		// depois refatorar!!!!		18 cartas - 1 inverte - 1 bebe - ...
		cartas.add(Carta.BRANCA);
		cartas.add(Carta.PULA_O_PROXIMO);
		cartas.add(Carta.BRANCA);
		cartas.add(Carta.INVERTE_ORDEM);
		cartas.add(Carta.PUXA_MAIS_UMA);
		cartas.add(Carta.BRANCA);
		cartas.add(Carta.PUXA_MAIS_UMA);
		cartas.add(Carta.BEBE);
		cartas.add(Carta.PULA_O_PROXIMO);
		cartas.add(Carta.BRANCA);
		cartas.add(Carta.PUXA_MAIS_UMA);
		cartas.add(Carta.BRANCA);
		cartas.add(Carta.PULA_O_PROXIMO);
		cartas.add(Carta.BRANCA);
		cartas.add(Carta.PUXA_MAIS_UMA);
		cartas.add(Carta.BRANCA);
		
		Collections.shuffle(cartas);
		Collections.shuffle(cartas);
		Collections.shuffle(cartas);
	}

	private void criarLayout() {
		
		int contador = 0;
		
		for (int i = 0; i < 4; i++) {   // numero de linhas
			TableRow linha = new TableRow(this);
			for (int j = 0; j < 4; j++) {  // numero de cartas por linha
				
				Carta carta = new Carta(this);
				carta.setPadding(10, 0, 0, 0);
				carta.setOnClickListener(this);
				carta.setSignificado(cartas.get(contador));   // add significado a carta (pula/branca/mais1/...)
				
				String novoId = i +""+ j;
				carta.setId(Integer.parseInt(novoId));
				
				linha.addView(carta);
				
				contador++;
			}
			tb.addView(linha);
		}
	}
	
	private void animarEntradaCarta() {
		Animation in = AnimationUtils.makeInAnimation(this, true);
		cartaAberta.startAnimation(in);
		cartaAberta.setVisibility(View.VISIBLE);
	}
	
	private void animarEntradaJogador() {
		Animation in = AnimationUtils.makeInAnimation(this, false);
		campoJogador.startAnimation(in);
		campoJogador.setVisibility(View.VISIBLE);
	}

	@Override
	public void onClick(View v) {
		
		player.click();

		Carta c = (Carta) findViewById(v.getId());
		
		if (!c.foiClicada()) {
			animarEntradaCarta();
			c.clicou();
			
			cartaAberta.setImageResource(c.getImagem());
			c.setImageResource(c.getImagemPequena());
			
			switch (c.getSignificado()) {
			
			case Carta.BEBE:
				
				setContentView(R.layout.achou_carta);
				
				Handler handler = new Handler(); 
			    handler.postDelayed(new Runnable() { 
			         public void run() {
			        	 finalizaPartida();
			         } 
			    }, 1500); 
				
				break;

			case Carta.BRANCA:
				atualizarJogadorAtual();
				break;
				
			case Carta.INVERTE_ORDEM:
				Collections.reverse(jogadores);
				inverteuOrdem = !inverteuOrdem;
				atualizarJogadorAtual();
				break;
			
			case Carta.PULA_O_PROXIMO:
				atualizarJogadorAtual();
				atualizarJogadorAtual();
				break;
				
			case Carta.PUXA_MAIS_UMA:   // continua com o mesmo jogador
				campoJogador.setText(jogadorAtual.getNome() +" "+ getResources().getString(R.string.txt_vira_mais_uma));
				break;
				
			}
		}
	}
	
	private void finalizaPartida() {
		
		if (inverteuOrdem) {				// evitando que o minigame cartas interfira nos outros minigames
			Collections.reverse(jogadores);
		}
		
		jogadorAtual.addDerrota();
		player.aplausos();

		setContentView(R.layout.tela_bebe);
		TextView qmBebe = (TextView) findViewById(R.id.txt_qm_bebe);
		qmBebe.setText(jogadorAtual.getNome() +"\n\n"+ getResources().getString(R.string.txt_bebe));
		
		Handler handler = new Handler(); 
	    handler.postDelayed(new Runnable() { 
	         public void run() {
	       		finalizaMinigame();
	         } 
	    }, 2500); 
	}

	private void finalizaMinigame() {
		// retornando a lista de jogadores atualizada
		Intent i = this.getIntent();
		i.putExtra("listaAtualizada", (Serializable) jogadores);
		this.setResult(RESULT_OK, i);
		
		finish();
	}

	private void atualizarJogadorAtual() {
		if (indiceJogadorAtual == jogadores.size() - 1) {
			indiceJogadorAtual = 0;
		} else {
			indiceJogadorAtual++;
		}
		
		jogadorAtual = jogadores.get(indiceJogadorAtual);
		campoJogador.setText(jogadorAtual.getNome() +" "+ getResources().getString(R.string.txt_vira_uma));
		animarEntradaJogador();
	}
	
}